package com.amos.base.redis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.concurrent.TimeUnit;

@Component
public class RedisClient {
    @Autowired
    private RedisTemplate redisTemplate;
    /**
     * 根据key来获取对应的value
     */
    public Object getByKey(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * TODO 判断String类型key是否存在
     */
    public boolean isKeyExist(String key) {
       return false;
    }

    /**
     * String类型的键值写入redis
     *
     * @param key
     * @param value
     * @return
     */
    public boolean set(String key, Object value) {
        try {
            redisTemplate.opsForValue().set(key,value);
            return true;
        } finally {
           return false;
        }
    }

    /**
     * TODO 如果键值存在 则不做任何操作
     * @param key
     * @param value
     * @return
     */
    public Long setnx(String key, String value) {
        return null;
    }

    /**
     * TODO String类型的键值写入redis,并设置失效时间
     *
     * @param key
     * @param value
     * @return
     */
    public boolean setKeyWithExpireTime(String key, String value, int time) {
        try {
            redisTemplate.opsForValue().set(key, value, time);
            return true;
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }

    /**
     * TODO list<String>结构的数据写入redis
     *
     * @param key
     * @param value
     * @return
     */
    public boolean lpush(String key, List<String> value) {
        return false;
    }

    /**
     * TODO  根据key获取list类型
     *
     * @param key
     * @return
     */
    public List<String> lrange(String key) {
       return null;
    }

    /**
     * TODO  根据key获取list类型 起止和结束
     * @param key
     * @param start
     * @param length
     * @return
     */
    public List<String> lrange(String key, int start, int length){
        return null;
    }

    /**
     * TODO 保存对象
     * @param key
     * @param o
     * @return
     */
    public boolean setAnObject(String key, Object o) {
        return false;
    }

    /**
     * TODO
     * @param key
     * @param newValue
     * @param <T>
     * @return
     */
    @SuppressWarnings("unchecked")
    public <T> T getSetT(String key, T newValue) {
       return null;
    }

//    public <T> T getAnObject(String key, Class<T> zz) {
//        Jedis client = jedisPool.getResource();
//        T t;
//        try {
//            String s = client.get(key);
//            if (s == null || s.length() == 0) {
//                return null;
//            }
//            t = Util.jsonToBean(s, zz);
//        } finally {
//            jedisPool.returnResourceObject(client);
//        }
//        return t;
//
//    }
//
//    public List<String> getKeys(String pattern) {
//        Jedis client = jedisPool.getResource();
//        List<String> result = new ArrayList<String>();
//        try {
//            Set<String> set = client.keys(pattern);
//            result.addAll(set);
//        } finally {
//            jedisPool.returnResourceObject(client);// 向连接池“归还”资源
//        }
//        return result;
//    }
//

    /**
     * 删除键
     * @param key
     * @return
     */
    public boolean delKey(String key) {
        try {
            redisTemplate.delete(key);
            return true;
        }catch (Exception e){
            e.printStackTrace();
            return false;
        }
    }
//
//    public <T> boolean hset(String key, String field, T t) {
//        Jedis client = jedisPool.getResource();
//        try {
//            String afterSerialize = Util.beanToJson(t);
//            client.hset(key, field, afterSerialize);
//            return true;
//        } finally {
//            jedisPool.returnResourceObject(client);// 向连接池“归还”资源
//        }
//
//    }
//
//    /**
//     * 存入的时hash结构的数据
//     *
//     * @param key
//     * key
//     * @param map
//     * map的key实质为field。
//     * @return
//     */
//    public <T, S> boolean hmset(String key, Map<T, S> map) {
//        Jedis client = jedisPool.getResource();
//        try {
//            Iterator<Entry<T, S>> iterator = map.entrySet().iterator();
//            Map<String, String> stringMap = new HashMap<String, String>();
//            String filed;
//            String value;
//            while (iterator.hasNext()) {
//                Entry<T, S> entry = iterator.next();
//                filed = String.valueOf(entry.getKey());
//                value = Util.beanToJson(entry.getValue());
//                stringMap.put(filed, value);
//            }
//            client.hmset(key, stringMap);
//            return true;
//        } finally {
//            jedisPool.returnResourceObject(client);// 向连接池“归还”资源
//        }
//
//    }
//
//    public <T> T hgetObject(String key, String field, Class<T> cls) {
//        Jedis client = jedisPool.getResource();
//        try {
//            String value = client.hget(key, field);
//            return (T) Util.jsonToBean(value, cls);
//        } finally {
//            jedisPool.returnResourceObject(client);// 向连接池“归还”资源
//        }
//
//    }
//
//    public String hgetString(String key, String field) {
//        Jedis client = jedisPool.getResource();
//        try {
//            String value = client.hget(key, field);
//            return value;
//        } finally {
//            jedisPool.returnResourceObject(client);// 向连接池“归还”资源
//        }
//
//    }
//
//    public Map<String, String> hGetAll(String key) {
//        Jedis client = jedisPool.getResource();
//        try {
//            return client.hgetAll(key);
//        } finally {
//            jedisPool.returnResourceObject(client);// 向连接池“归还”资源
//        }
//
//    }
//
//    public List<String> hkeys(String key) {
//        Jedis client = jedisPool.getResource();
//        try {
//            List<String> fields = new ArrayList<String>();
//            Set<String> set = client.hkeys(key);
//            fields.addAll(set);
//            return fields;
//        } finally {
//            jedisPool.returnResourceObject(client);// 向连接池“归还”资源
//        }
//
//    }
//
//    public List<String> hvals(String key) {
//        Jedis client = jedisPool.getResource();
//        try {
//            List<String> values = client.hvals(key);
//            return values;
//        } finally {
//            jedisPool.returnResourceObject(client);// 向连接池“归还”资源
//        }
//
//    }
//
//    public boolean hexists(String key, String field) {
//        Jedis client = jedisPool.getResource();
//        try {
//            return client.hexists(key, field);
//        } finally {
//            jedisPool.returnResourceObject(client);// 向连接池“归还”资源
//        }
//    }
//
//    public long incr(String key) {
//        Jedis client = jedisPool.getResource();
//        try {
//            return client.incr(key);
//        } finally {
//            jedisPool.returnResourceObject(client);
//        }
//    }
//
//    public void hdel(String key, String... fields) {
//        Jedis client = jedisPool.getResource();
//        try {
//            client.hdel(key, fields);
//        } finally {
//            jedisPool.returnResourceObject(client);
//        }
//    }
//
//    /**
//     *
//     *
//     * @param key
//     * @param field
//     */
//    public void lpush(String key, String field) {
//        Jedis client = jedisPool.getResource();
//        try {
//            client.lpush(key, field);
//        } finally {
//            jedisPool.returnResourceObject(client);
//        }
//    }
//
//    public void lpush(String key, Object obj) {
//        Jedis client = jedisPool.getResource();
//        try {
//            String field = Util.beanToJson(obj);
//            client.lpush(key, field);
//        } finally {
//            jedisPool.returnResourceObject(client);
//        }
//    }
//
//    /**
//     * 该方法不适用于普通的调用，该方法只针对于错误日志记录
//     *
//     * @param key
//     * @param field
//     */
//    public void lpushForErrorMsg(String key, String field) {
//        Jedis client = jedisPool.getResource();
//        try {
//            if (client.llen(key) > 1000) {
//                return;
//            }
//            client.lpush(key, field);
//        } finally {
//            jedisPool.returnResourceObject(client);
//        }
//    }
//
//    public long llen(String key){
//        Jedis client = jedisPool.getResource();
//        try {
//            return client.llen(key);
//        } finally{
//            jedisPool.returnResourceObject(client);
//        }
//    }
//
//    public List<String> blPop(String key, int timeoutSeconds) {
//        Jedis client = jedisPool.getResource();
//        try {
//            return client.blpop(timeoutSeconds, key);
//        } finally {
//            jedisPool.returnResourceObject(client);
//        }
//    }
//
//    public <T> long sadd(String key, String... values) {
//        Jedis client = jedisPool.getResource();
//        try {
//            return client.sadd(key, values);
//        } finally {
//            jedisPool.returnResourceObject(client);
//        }
//    }
//
//    public <T> long sadd(String key, List<T> ts) {
//        Jedis client = jedisPool.getResource();
//        try {
//            if (ts == null || ts.size() ==0) {
//                return 0l;
//            }
//            String[] values = new String[ts.size()];
//            for (int i = 0; i < ts.size(); i++) {
//                values[i] = ts.get(i).toString();
//            }
//            return client.sadd(key, values);
//        } finally {
//            jedisPool.returnResourceObject(client);
//        }
//    }
//
//    public long srem(String key, String... values) {
//        Jedis client = jedisPool.getResource();
//        try {
//            return client.srem(key, values);
//        } finally {
//            jedisPool.returnResourceObject(client);
//        }
//    }
//
//    public <T> long srem(String key, List<T> ts) {
//        Jedis client = jedisPool.getResource();
//        try {
//            if (ts == null || ts.size() ==0) {
//                return 0l;
//            }
//            String[] values = new String[ts.size()];
//            for (int i = 0; i < ts.size(); i++) {
//                values[i] = ts.get(i).toString();
//            }
//            return client.srem(key, values);
//        } finally {
//            jedisPool.returnResourceObject(client);
//        }
//    }
//
//    public Set<String> getByRange(String key, double min, double max) {
//        Jedis client = jedisPool.getResource();
//        try {
//            return client.zrangeByScore(key, min, max);
//        } finally {
//            jedisPool.returnResourceObject(client);
//        }
//    }
//
//    public Long decr(String key) {
//        Jedis client = jedisPool.getResource();
//        try {
//            return client.decr(key);
//        } finally {
//            jedisPool.returnResourceObject(client);
//        }
//    }
//
//    public Long hlen(String key) {
//        Jedis client = jedisPool.getResource();
//        try {
//            return client.hlen(key);
//        } finally {
//            jedisPool.returnResourceObject(client);
//        }
//    }
//
//    public List<String> hmget(String key, String... fields) {
//        Jedis client = jedisPool.getResource();
//        try {
//            return client.hmget(key, fields);
//        } finally {
//            jedisPool.returnResourceObject(client);
//        }
//    }
//
//    /**
//     * 从redis里面得到以 某字符串开头的所有key
//     *
//     * @param str
//     * */
//    public Set<String> getKeyByStr(String str) {
//        Jedis client = jedisPool.getResource();
//
//        Set<String> keys = null;
//        try {
//            keys = client.keys(str);
//        } finally {
//            jedisPool.returnResourceObject(client);
//        }
//        return keys;
//    }
//
//    public void ltrim(String key, int start, int stop){
//        Jedis client = jedisPool.getResource();
//        try {
//            client.ltrim(key, start, stop);
//        } finally{
//            jedisPool.returnResourceObject(client);
//        }
//    }
    /**
     *
     * @param key
     * @param seconds
     * @return
     */
    public Long expire(String key,Integer seconds){
        try {
            redisTemplate.expire(key, seconds, TimeUnit.NANOSECONDS);
            return 1L;
        }catch (Exception e){
            e.printStackTrace();
            return 0L;
        }
    }
//
//    /**
//     * 存入的时hash结构的数据,并且去掉value中的引号
//     *
//     * @param key
//     * key
//     * @param map
//     * map的key实质为field。
//     * @return
//     */
//    public <T, S> boolean hmsetWithoutQuotationMarks(String key, Map<T, S> map) {
//        Jedis client = jedisPool.getResource();
//        try {
//            Iterator<Entry<T, S>> iterator = map.entrySet().iterator();
//            Map<String, String> stringMap = new HashMap<String, String>();
//            String filed;
//            String value;
//            while (iterator.hasNext()) {
//                Entry<T, S> entry = iterator.next();
//                filed = String.valueOf(entry.getKey());
//                value = JSON.toJSONString(entry.getValue()).replace("\"", "");
//                stringMap.put(filed, value);
//            }
//            client.hmset(key, stringMap);
//            return true;
//        } finally {
//            jedisPool.returnResourceObject(client);// 向连接池“归还”资源
//        }
//    }
}
